/*
 * onenet_data.h - OneNet数据封装库头文件
 * 基于thingmodel-json-import.json规范实现
 * 提供各种数据类型的JSON格式封装函数
 */

#ifndef __ONENET_DATA_H
#define __ONENET_DATA_H

#include <stdint.h>
#include <stdbool.h>

// OneNet数据发送状态枚举
typedef enum
{
    ONENET_STATUS_SUCCESS = 0,    // 成功
    ONENET_STATUS_ERROR = -1,     // 错误
    ONENET_STATUS_TIMEOUT = -2,   // 超时
    ONENET_STATUS_INVALID = -3    // 无效参数
} OneNet_Status_t;

// OneNet消息类型枚举
typedef enum
{
    ONENET_MSG_PROPERTY = 0,      // 属性上报
    ONENET_MSG_EVENT,             // 事件上报
    ONENET_MSG_SERVICE_RESPONSE   // 服务响应
} OneNet_MsgType_t;

// OneNet数组数据结构
typedef struct
{
    int32_t *data;                // 数组数据指针
    uint8_t length;               // 数组长度
} OneNet_Array_t;

// OneNet结构体参数
typedef struct
{
    int32_t params1;              // 参数1
    bool params2;                 // 参数2
} OneNet_Struct_t;

// 函数声明

/**
 * @brief 初始化OneNet数据封装库
 * @return OneNet_Status_t 状态码
 */
OneNet_Status_t OneNet_Init(void);

/**
 * @brief 发送布尔类型属性数据
 * @param value 布尔值
 * @param message_id 消息ID
 * @return OneNet_Status_t 状态码
 */
OneNet_Status_t OneNet_SendBool(bool value, uint32_t message_id);

/**
 * @brief 发送整数类型属性数据
 * @param identifier 属性标识符
 * @param value 整数值
 * @param message_id 消息ID
 * @return OneNet_Status_t 状态码
 */
OneNet_Status_t OneNet_SendInt32(const char *identifier, int32_t value, uint32_t message_id);

/**
 * @brief 发送浮点数类型属性数据（如温度）
 * @param identifier 属性标识符
 * @param value 浮点值
 * @param message_id 消息ID
 * @return OneNet_Status_t 状态码
 */
OneNet_Status_t OneNet_SendFloat(const char *identifier, float value, uint32_t message_id);

/**
 * @brief 发送字符串类型属性数据
 * @param identifier 属性标识符
 * @param value 字符串值
 * @param message_id 消息ID
 * @return OneNet_Status_t 状态码
 */
OneNet_Status_t OneNet_SendString(const char *identifier, const char *value, uint32_t message_id);

/**
 * @brief 发送枚举类型属性数据
 * @param identifier 属性标识符
 * @param value 枚举值
 * @param message_id 消息ID
 * @return OneNet_Status_t 状态码
 */
OneNet_Status_t OneNet_SendEnum(const char *identifier, int value, uint32_t message_id);

/**
 * @brief 发送数组类型属性数据
 * @param identifier 属性标识符
 * @param array 数组数据
 * @param message_id 消息ID
 * @return OneNet_Status_t 状态码
 */
OneNet_Status_t OneNet_SendArray(const char *identifier, const OneNet_Array_t *array, uint32_t message_id);

/**
 * @brief 发送位图类型属性数据
 * @param identifier 属性标识符
 * @param bitmap 位图值
 * @param message_id 消息ID
 * @return OneNet_Status_t 状态码
 */
OneNet_Status_t OneNet_SendBitmap(const char *identifier, uint32_t bitmap, uint32_t message_id);

/**
 * @brief 发送结构体类型属性数据
 * @param identifier 属性标识符
 * @param struct_data 结构体数据
 * @param message_id 消息ID
 * @return OneNet_Status_t 状态码
 */
OneNet_Status_t OneNet_SendStruct(const char *identifier, const OneNet_Struct_t *struct_data, uint32_t message_id);

/**
 * @brief 发送错误事件
 * @param error_code 错误代码
 * @param message_id 消息ID
 * @return OneNet_Status_t 状态码
 */
OneNet_Status_t OneNet_SendErrorEvent(int error_code, uint32_t message_id);

/**
 * @brief 发送服务执行结果响应
 * @param service_id 服务ID
 * @param result 执行结果
 * @param message_id 消息ID
 * @return OneNet_Status_t 状态码
 */
OneNet_Status_t OneNet_SendServiceResponse(const char *service_id, bool result, uint32_t message_id);

/**
 * @brief 发送属性设置的响应（用于应答云端下发的指令）
 * @param request_id 从云端接收到的消息ID (通常是 "id" 字段)
 * @param code 响应码 (200为成功)
 * @param msg 响应消息 (例如 "success")
 * @return OneNet_Status_t 状态码
 */
OneNet_Status_t OneNet_SendPropertySetResponse(const char *request_id, int code, const char *msg);

/**
 * @brief 发送多个属性的组合数据
 * @param message_id 消息ID
 * @param format 格式化字符串，支持的占位符：
 *               %b - bool, %d - int32, %f - float, %s - string, %e - enum
 * @param ... 可变参数列表
 * @return OneNet_Status_t 状态码
 * 
 * 使用示例：
 * OneNet_SendMultipleProperties(123456, 
 *     "temp:%f,humidity:%d,status:%b", 
 *     "temp", 25.5f, "humidity", 60, "status", true);
 */
OneNet_Status_t OneNet_SendMultipleProperties(uint32_t message_id, const char *format, ...);

/**
 * @brief 获取自动递增的消息ID
 * @return uint32_t 消息ID
 */
uint32_t OneNet_GetNextMessageId(void);

/**
 * @brief 设置OneNet发送回调函数
 * @param send_func 发送函数指针，接收JSON字符串并发送到4G模块
 */
void OneNet_SetSendCallback(void (*send_func)(const char *json_data));

// 预定义的属性标识符（基于thingmodel.json）
#define ONENET_PROP_ARRAY      "func_array"
#define ONENET_PROP_BITMAP     "func_bitmap"
#define ONENET_PROP_BOOL       "func_bool"
#define ONENET_PROP_ENUM       "func_enum"
#define ONENET_PROP_INT32      "func_int32"
#define ONENET_PROP_STRING     "func_string"
#define ONENET_PROP_STRUCT     "func_struct"

// 自定义属性标识符（常用的物联网数据）
#define ONENET_PROP_TEMP       "temp"        // 温度
#define ONENET_PROP_HUMIDITY   "humidity"    // 湿度
#define ONENET_PROP_PRESSURE   "pressure"    // 压力
#define ONENET_PROP_VOLTAGE    "voltage"     // 电压
#define ONENET_PROP_CURRENT    "current"     // 电流
#define ONENET_PROP_GPS_LAT    "gps_lat"     // GPS纬度
#define ONENET_PROP_GPS_LON    "gps_lon"     // GPS经度
#define ONENET_PROP_SPEED      "speed"       // 速度
#define ONENET_PROP_DISTANCE   "distance"    // 距离
#define ONENET_PROP_STATUS     "status"      // 状态
#define ONENET_PROP_ROLL       "roll"        // 翻滚角
#define ONENET_PROP_PITCH      "pitch"       // 俯仰角
#define ONENET_PROP_YAW        "yaw"         // 偏航角

// 事件标识符
#define ONENET_EVENT_ERROR     "Error"

// 服务标识符
#define ONENET_SERVICE_EXECUTE "execute"

#endif /* __ONENET_DATA_H */ 